﻿// Expression.h: interface for the CExpression class.
//
//////////////////////////////////////////////////////////////////////

#ifndef EXPRESSION_H_
#define EXPRESSION_H_

#pragma once

#include <QtCore/qglobal.h>

#include "sys_h/DATATYPE.h"
#include "sys_h/DATATYPE_S.h"
#include "sh_m_h/NSA3000TRD.h"
#include "ExpScript.h"
#include "db_h/hTableDef.h"

#if defined(NS_EXPRESSION_LIBRARY)
#define NS_EXPRESSIONSHARED_EXPORT Q_DECL_EXPORT
#else

#define NS_EXPRESSIONSHARED_EXPORT Q_DECL_IMPORT
#endif

class NS_EXPRESSIONSHARED_EXPORT Expression  
{
public:
	Expression();
	virtual ~Expression();

/*	函数：	InitExpressionParam
	用途：	初始化二次计算参数
	输入：
	返回：	*/
	XINT	InitExpressionParam(NSA3000TRD *pRealDB, XINT ProcId);

/*	函数：	ReleaseExpressionParam
	用途：	释放二次计算参数
	输入：
	返回：	*/
	void	ReleaseExpressionParam();


/************************************************************************/
/*				      二次计算的处理过程                                */
/************************************************************************/
/*	函数：	ExportExpImmediately
	用途：	根据启动源立即启动并输出二次计算结果
	输入：	SG_SOE_EX_DEFINE *pExpCause
	返回：	*/	
	void	ExportExpImmediately(Exp_Start_Info *pExpCause);

/*	函数：	ExpDataPeriods
	用途：	周期计算二次计算数据
	输入：	DWORD CurTime
	返回：	*/
	XINT	ExpDataPeriods();

/************************************************************************/
/*				      双点信号的处理过程                                */
/************************************************************************/
/*	函数：	ExportDoubleSignalImmediately
	用途：	立即计算并输出双点合并信号
	输入：	int YxDevId, short YxIndexNo, UCHAR YxValue, 
			time_t OccorTime: SOE或变位发生时间, 
			WORD OccorMsel: SOE发生毫秒, 
			WORD DataType: 告警类型，变位或SOE
	返回：	*/
	XINT	ExportDoubleSignalImmediately(XINT YxDevId, XUSHORT YxIndexNo, XUCHAR YxValue, XUINT OccorTime, XUSHORT OccorMsel, XUSHORT DataType);

/*	函数：	ExportDoubleSignalImmediately
	用途：	立即计算并输出双点合并信号
	输入：	SG_SOE_EX_DEFINE *pExpCause: 启动源,
			BOOL &bFindFlag：是否查找到
	返回：	*/
	void	ExportDoubleSignalYxCOSImmediately(Exp_Start_Info *pExpCause, XBOOL8 &bFindFlag);
/*	函数：	ExportDoubleSignalPeriods
	用途：	周期计算并输出双点合并信号
	输入：	
	返回：	*/
	XINT	ExportDoubleSignalPeriods();


/*	函数：	StartDoubleSignalFlag
	用途：	立即启动双点信号的计算标志
	输入：	
	返回：	*/
	XBOOL8	StartDoubleSignalFlag(Exp_Start_Info *pExCause, XUINT CurTime);
/************************************************************************/
/*					电压合格率的处理过程                                */
/************************************************************************/
//1、按整定周期调用函数CalculateVoltEligible()计算运行时间和合格时间
//2、过零点调用函数SetYCEligible_FinishFlag()设置完成标志，冻结每天的合格率
//3、调用函数ExportVoltEligibleResult()输出结果，一次只输出一个
//4、自行组织SQL语句写入历史库	

/*	函数：	CalculateVoltEligible
	用途：	周期计算电压合格时间及运行时间
	输入：	
	返回：	*/
	XINT	CalculateVoltEligible();

/*	函数：	ExportVoltEligibleResult
	用途：	获取电压合格率统计结果
	输入：	hdata_yc_eligible &HisData
	返回：	*/
	XINT	ExportVoltEligibleResult(hdata_yc_eligible &HisData);

/*	函数：	GetYcValue
	用途：	获取遥测数据值
	输入：	int DeviceId, WORD YcNo, int &Yc_RecId, float &OutPutV
	返回：	*/
	XINT	GetYcValue(XUINT DeviceId, XUSHORT YcNo, XUINT &Yc_RecId, XDOUBLE &OutPutV);

/*	函数：	SetYCEligible_FinishFlag()
	用途：	设置电压合格率统计完成标志
	输入：	
	返回：	*/
	void	SetYCEligible_FinishFlag();

//获取二次计算或双点信号的结果

/*	函数：	NewYxCOSDataFlag
	用途：	判断是否有遥信变位告警
	输入：	
	返回：	告警个数*/
	XBOOL8	NewYxCOSDataFlag();

/*	函数：	NewYxSOEDataFlag
	用途：	判断是否有SOE告警数据
	输入：	
	返回：	*/
	XBOOL8	NewYxSOEDataFlag();

/*	函数：	NewYxValDataFlag
	用途：	判断是否有遥信值数据
	输入：	
	返回：	*/
	XBOOL8	NewYxValDataFlag();

/*	函数：	NewYcValDataFlag
	用途：	判断是否有遥测值数据
	输入：	
	返回：	*/
	XBOOL8	NewYcValDataFlag();

/*	函数：	NewYmValDataFlag
	用途：	判断是否有遥脉值数据
	输入：	
	返回：	*/
	XBOOL8	NewYmValDataFlag();

/*	函数：	GetYxCOSResultData
	用途：	获取遥信变位告警数据
	输入：	char *&Buff, WORD BuffLen
	返回：	告警个数*/
	XINT	GetYxCOSResultData(XCHAR *&Buff, XUSHORT &BuffLen);

/*	函数：	GetYxSOEResultData
	用途：	获取SOE告警数据
	输入：	
	返回：	*/
	XINT	GetYxSOEResultData(XCHAR *&Buff, XUSHORT &BuffLen);

/*	函数：	GetYxValResultData
	用途：	获取遥信值数据
	输入：	
	返回：	*/
	XINT	GetYxValResultData(XCHAR *&Buff, XUSHORT &BuffLen);

/*	函数：	GetYcValResultData
	用途：	获取遥测值数据
	输入：	
	返回：	*/
	XINT	GetYcValResultData(XCHAR *&Buff, XUSHORT &BuffLen);

/*	函数：	GetYmValResultData
	用途：	获取遥脉值数据
	输入：	
	返回：	*/
	XINT	GetYmValResultData(XCHAR *&Buff, XUSHORT &BuffLen);

protected:
/*	函数：	InitExpParam
	用途：	初始化二次计算参数
	输入：
	返回：	*/
	void	InitExpParam(rExpDefine_Info *pExp_Define,XINT ExpNum, rExpVariable_List *pExpVariable,XINT VariableNum_Total, XINT &Exp_Index);

/*	函数：	InitDoubleSignalParam
	用途：	初始化双点参数
	输入：
	返回：	*/
	void	InitDoubleSignalParam(rExpDefine_Info *pExp_Define, XINT DbSignal_Num, rExpVariable_List *pExpVariable, XINT VariableNum_Total, XINT &DbSgl_Index);

/*	函数：	InitVoltEligibleParam
	用途：	初始化电压合格率参数
	输入：
	返回：	*/
	void	InitVoltEligibleParam(rExpDefine_Info *pExp_Define, XINT VoltE_Num, rExpVariable_List *pExpVariable, XINT VariableNum_Total, XINT &VltEgb_Index);

	/*	函数：	GetTableAllBuff
	用途：	获取表的所有记录内容
	输入：
	返回：	*/
	XINT	GetTableAllBuff(XINT App_Type, XINT Table_Id, XCHAR *&Buff);
	
protected:
/*	函数：	StartExpressionFlag
	用途：	启动二次计算标志
	输入：	
	返回：	*/
	XBOOL8	StartExpressionFlag(Exp_Start_Info *pExpStart, XUSHORT &StartIndex, XUINT CurTime);

/*	函数：	ExportExpResult
	用途：	将二次计算结果转为告警数据或实时库刷新数据
	输入：	WORD ExpIndexNo
	返回：	*/	
	void	ExportExpResult(XUSHORT ExpIndexNo, XUINT CurTime);

/*	函数：	CalculateExpResult
	用途：	计算二次计算结果
	输入：	
	返回：	*/
	void	CalculateExpResult(XINT ExpNo, XUINT curtime);
	
/*	函数：	CalculateExpResult
	用途：	获取双点遥信SOE值
	输入：	
	返回：	*/
	void	GetDoubleYxSOEData(XUSHORT DoubleYxIndex);
protected:
	NSA3000TRD				*m_pRealDB;
//	CCompute				*m_pCompute;
//	CFormula				m_formula;
//	DATA_DESCRIBLE_STRU		m_ComputeVal;
	ExpScript				*m_pExpScript;
	Var_DataVal				m_ComputeResult;
	XUSHORT					m_DbSgl_Index;					//双点信号周期处理序号
	XUSHORT					m_DbSgl_OneNum;					//双点信号一次处理个数
	XUSHORT					m_Exp_Index;					//二次计算周期处理序号
	XUSHORT					m_Exp_OneNum;					//二次计算一次处理个数

	

};

#endif // !defined(AFX_EXPRESSION_H__8C03B41B_3932_4BBB_B009_4B27B0EEE6DD__INCLUDED_)
